from mcp.server.fastmcp import FastMCP
from typing import Union, Optional
import math

# 创建 MCP 服务实例
mcp = FastMCP("Calculator Server")

# ============================================================================
# 打招呼工具
# ============================================================================

@mcp.tool()
def say_hello(name: str = "") -> str:
    """生成问候消息
    
    Args:
        name: 用户姓名（可选）
        
    Returns:
        问候消息
    """
    if name:
        return f"你好，{name}！欢迎使用我们的MCP计算器服务！"
    else:
        return "你好！欢迎使用我们的MCP计算器服务！"

@mcp.tool()
def say_goodbye(name: str = "") -> str:
    """生成告别消息
    
    Args:
        name: 用户姓名（可选）
        
    Returns:
        告别消息
    """
    if name:
        return f"再见，{name}！感谢使用我们的计算器服务！"
    else:
        return "再见！感谢使用我们的计算器服务！"

# ============================================================================
# 数学计算工具
# ============================================================================

@mcp.tool()
def add(a: Union[int, float], b: Union[int, float]) -> float:
    """加法运算
    
    Args:
        a: 第一个数字
        b: 第二个数字
        
    Returns:
        两数之和
    """
    result = a + b
    return result

@mcp.tool()
def subtract(a: Union[int, float], b: Union[int, float]) -> float:
    """减法运算
    
    Args:
        a: 被减数
        b: 减数
        
    Returns:
        两数之差
    """
    result = a - b
    return result

@mcp.tool()
def multiply(a: Union[int, float], b: Union[int, float]) -> float:
    """乘法运算
    
    Args:
        a: 第一个数字
        b: 第二个数字
        
    Returns:
        两数之积
    """
    result = a * b
    return result

@mcp.tool()
def divide(a: Union[int, float], b: Union[int, float]) -> str:
    """除法运算
    
    Args:
        a: 被除数
        b: 除数
        
    Returns:
        两数之商或错误信息
    """
    if b == 0:
        return "错误：除数不能为零"
    
    result = a / b
    return f"结果: {result}"

@mcp.tool()
def power(base: Union[int, float], exponent: Union[int, float]) -> str:
    """幂运算（增强版）"""
    try:
        if base == 0 and exponent < 0:
            return "错误：0的负数次幂未定义"
        if base < 0 and not isinstance(exponent, int):
            return "错误：负数的非整数次幂可能产生复数结果"
        
        result = base ** exponent
        return f"{base}^{exponent} = {result}"
    except OverflowError:
        return "错误：计算结果过大"
    except Exception as e:
        return f"计算错误: {str(e)}"

@mcp.tool()
def square_root(number: Union[int, float]) -> str:
    """平方根运算
    
    Args:
        number: 要计算平方根的数字
        
    Returns:
        平方根结果或错误信息
    """
    if number < 0:
        return "错误：负数没有实数平方根"
    
    result = math.sqrt(number)
    return f"√{number} = {result}"

@mcp.tool()
def calculate_expression(expression: str) -> str:
    """计算数学表达式
    
    Args:
        expression: 数学表达式字符串（支持 +, -, *, /, **, (), sqrt, sin, cos, tan）
        
    Returns:
        计算结果或错误信息
    """
    try:
        # 安全的数学函数字典
        safe_dict = {
            "__builtins__": {},
            "sqrt": math.sqrt,
            "sin": math.sin,
            "cos": math.cos,
            "tan": math.tan,
            "log": math.log,
            "log10": math.log10,
            "exp": math.exp,
            "pi": math.pi,
            "e": math.e,
            "abs": abs,
            "round": round,
            "pow": pow
        }
        
        result = eval(expression, safe_dict)
        return f"表达式: {expression}\n结果: {result}"
    except ZeroDivisionError:
        return "错误：除零错误"
    except ValueError as e:
        return f"数值错误: {str(e)}"
    except SyntaxError:
        return "语法错误：表达式格式不正确"
    except Exception as e:
        return f"计算失败: {str(e)}"

# ============================================================================
# 资源定义
# ============================================================================

@mcp.resource("calculator://help")
def get_help() -> str:
    """获取计算器帮助信息"""
    help_text = """
# MCP 计算器服务帮助

## 可用工具：

### 问候工具
- say_hello(name): 生成问候消息
- say_goodbye(name): 生成告别消息

### 基础运算
- add(a, b): 加法运算
- subtract(a, b): 减法运算
- multiply(a, b): 乘法运算
- divide(a, b): 除法运算
- power(base, exponent): 幂运算
- square_root(number): 平方根运算

### 高级计算
- calculate_expression(expression): 计算复杂数学表达式

## 使用示例：
- add(10, 5) → 15
- divide(10, 3) → 结果: 3.333...
- calculate_expression("2 + 3 * 4") → 表达式: 2 + 3 * 4, 结果: 14
- square_root(16) → √16 = 4.0
"""
    return help_text

if __name__ == "__main__":
    mcp.run(transport="stdio")